/**
 * 
 */
package compilador.analizadores;

import java.util.ArrayList;

import compilador.analizadorLexico.simbolos.SimboloLexico;
import compilador.analizadorSemantico.tablaSimbolos.TablaSimboloSemantico;
import compilador.analizadorSintactico.categoriasSintacticas.SimboloError;
import compilador.analizadorSintactico.categoriasSintacticas.UnidadCompilacion;

/**
 * @author samsung
 *
 */
public class AnalizadorSemantico  {

	
	//------------------------------------------------------------------------------------
	//							    	Atributos
	//------------------------------------------------------------------------------------
	
	private TablaSimboloSemantico tablaSimbolos;
	private UnidadCompilacion unidadCompilacion;
	private ArrayList<SimboloError> errores;

	//------------------------------------------------------------------------------------
	//								   Constructores
	//------------------------------------------------------------------------------------
	
	public AnalizadorSemantico(UnidadCompilacion unidadCompilacion){
		this.unidadCompilacion = unidadCompilacion;
		this.errores = new ArrayList<SimboloError>();
		
		analizar();
	}

	//------------------------------------------------------------------------------------
	//									   Metodos
	//------------------------------------------------------------------------------------
	
	public void analizar(){
		
		if(unidadCompilacion!= null){
		this.tablaSimbolos = new TablaSimboloSemantico();
		this.unidadCompilacion.llenarTablaSimbolos(tablaSimbolos);
		this.unidadCompilacion.analizarSemantica(tablaSimbolos, errores, null, null);
		}
	}
	
	
	public static boolean verificarCompatibilidad(String value1, String value2) {

		if(value1.equals(value2))
			return true;
		else
			return false;
	}

	public static String calcularTipo(String value1, String value2) {
		
		if((value1.equals("int") && value2.equals("rat")) || (value1.equals("rat") && value2.equals("int")))
			return "rat";
		
		if((value1.equals("str") && (value2.equals("int") ||value2.equals("rat"))) 
				|| (value2.equals("str") && (value1.equals("int") ||value1.equals("rat"))) )
			return "str";
		
		if(value1.equals("int") && value2.equals("int"))
			return "int";

		if(value1.equals("rat") && value2.equals("rat")) 
			return "rat";
					
		if(value1.equals("str") && value2.equals("str")) 
			return "str";
		
		return "";
	}

	public static String getTipoOperando(SimboloLexico simboloLexico) {
		
		if(simboloLexico.getToken().equals("int"))
			return "int";
		
		if(simboloLexico.getToken().equals("rat"))
			return "rat";
		
		if(simboloLexico.getToken().equals("str"))
			return "str";
		
		return "tipo";
	}


	/**
	 * Metodo que nos retorna el valor de tablaSimbolos
	 * @return  tablaSimbolos. Valor retornado
	 */
	public TablaSimboloSemantico getTablaSimbolos() {
		return tablaSimbolos;
	}


	/**
	 * Metodo que permite asignar el valor de tablaSimbolos
	 * @param tablaSimbolos. Valor a asignar tablaSimbolos
	 */
	public void setTablaSimbolos(TablaSimboloSemantico tablaSimbolos) {
		this.tablaSimbolos = tablaSimbolos;
	}


	/**
	 * Metodo que nos retorna el valor de unidadCompilacion
	 * @return  unidadCompilacion. Valor retornado
	 */
	public UnidadCompilacion getUnidadCompilacion() {
		return unidadCompilacion;
	}


	/**
	 * Metodo que permite asignar el valor de unidadCompilacion
	 * @param unidadCompilacion. Valor a asignar unidadCompilacion
	 */
	public void setUnidadCompilacion(UnidadCompilacion unidadCompilacion) {
		this.unidadCompilacion = unidadCompilacion;
	}


	/**
	 * Metodo que nos retorna el valor de errores
	 * @return  errores. Valor retornado
	 */
	public ArrayList<SimboloError> getErrores() {
		return errores;
	}


	/**
	 * Metodo que permite asignar el valor de errores
	 * @param errores. Valor a asignar errores
	 */
	public void setErrores(ArrayList<SimboloError> errores) {
		this.errores = errores;
	}
}
